#include "get_kms_file_by_file_id_command.h"
#include "service/backend_service.h"
#include "command_executor.h"
#include <QDebug>
#include <QUrl>
#include <QNetworkRequest>
#include <QJsonDocument>
#include <QJsonParseError>

GetKmsFileByFileIdCommand::GetKmsFileByFileIdCommand(QObject *parent)
    : BaseCommand(parent)
{
}

GetKmsFileByFileIdCommand::~GetKmsFileByFileIdCommand()
{
}

void GetKmsFileByFileIdCommand::setNetworkAccessManager(QNetworkAccessManager *networkManager)
{
    // 如果之前已经设置了 networkManager，先断开旧的连接
    if (m_networkManager) {
        disconnect(m_networkManager, &QNetworkAccessManager::finished,
                   this, &GetKmsFileByFileIdCommand::handleGetKmsFileResponse);
    }
    
    BaseCommand::setNetworkAccessManager(networkManager);
    
    // 连接网络请求完成信号
    if (m_networkManager) {
        connect(m_networkManager, &QNetworkAccessManager::finished,
                this, &GetKmsFileByFileIdCommand::handleGetKmsFileResponse);
    }
}

bool GetKmsFileByFileIdCommand::execute(const QString &fileId)
{
    if (!isValid()) {
        qDebug() << "GetKmsFileByFileIdCommand: BackendService 或 QNetworkAccessManager 未设置";
        emit getKmsFileByFileIdCompleted(-1, "BackendService 或 QNetworkAccessManager 未设置", QVariantMap());
        return false;
    }
    
    if (fileId.isEmpty()) {
        qDebug() << "GetKmsFileByFileIdCommand: 文件ID为空，无法获取文件信息";
        emit getKmsFileByFileIdCompleted(-1, "文件ID为空", QVariantMap());
        return false;
    }
    
    // 检查是否有accessToken，如果没有则先获取
    QString accessToken = CommandExecutor::getAccessToken();
    if (accessToken.isEmpty()) {
        // 获取当前选中的公司ID
        QString companyId = m_backendService->loadSelectedCompanyId();
        if (!companyId.isEmpty()) {
            qDebug() << "GetKmsFileByFileIdCommand: 没有accessToken，先获取accessToken，公司ID:" << companyId;
            // 注意：这里不能立即发送请求，因为ensureAccessToken是异步的
            // 为了简化，这里直接返回错误，让调用者处理
            emit getKmsFileByFileIdCompleted(-1, "没有可用的accessToken，请先登录", QVariantMap());
            return false;
        } else {
            qDebug() << "GetKmsFileByFileIdCommand: 没有选中的公司ID，无法获取accessToken";
            emit getKmsFileByFileIdCompleted(-1, "没有选中的公司ID，无法获取accessToken", QVariantMap());
            return false;
        }
    }
    
    // 获取 baseUrl
    QString baseUrl = getBaseUrl();
    
    // 构建请求URL
    QString url = buildRequestUrl(baseUrl, fileId);
    
    qDebug() << "GetKmsFileByFileIdCommand: 发送获取KmsFile请求到:" << url;
    qDebug() << "GetKmsFileByFileIdCommand: 文件ID:" << fileId;
    
    // 创建网络请求
    QNetworkRequest request = createRequest(url, "GET", "GetKmsFileByFileIdCommand/1.0");
    
    // 添加token到请求头
    addTokenToRequest(request, accessToken);
    
    // 发送GET请求
    QNetworkReply *reply = m_networkManager->get(request);
    if (!reply) {
        qDebug() << "GetKmsFileByFileIdCommand: 创建网络请求失败";
        emit getKmsFileByFileIdCompleted(-1, "创建网络请求失败", QVariantMap());
        return false;
    }
    
    // 设置请求类型属性
    reply->setProperty("requestType", "getKmsFileByFileId");
    // 保存文件ID，用于响应处理
    reply->setProperty("fileId", fileId);
    
    qDebug() << "GetKmsFileByFileIdCommand: 已发送获取KmsFile请求";
    
    return true;
}

void GetKmsFileByFileIdCommand::handleGetKmsFileResponse(QNetworkReply *reply)
{
    // 检查对象是否仍然有效
    if (!isValid()) {
        qDebug() << "GetKmsFileByFileIdCommand: 对象已被销毁，忽略响应";
        if (reply) {
            reply->deleteLater();
        }
        return;
    }
    
    if (!reply) {
        qDebug() << "GetKmsFileByFileIdCommand: 获取KmsFile响应为空";
        if (isValid()) {
            emit getKmsFileByFileIdCompleted(-1, "获取KmsFile响应为空", QVariantMap());
        }
        return;
    }
    
    QString requestType = reply->property("requestType").toString();
    if (requestType != "getKmsFileByFileId") {
        // 不是获取KmsFile请求，忽略
        reply->deleteLater();
        return;
    }
    
    // 检查网络错误
    if (reply->error() != QNetworkReply::NoError) {
        int errorCode = reply->error();
        QString errorString = reply->errorString();
        qDebug() << "GetKmsFileByFileIdCommand: 获取KmsFile网络请求错误:" << errorString;
        if (isValid()) {
            emit getKmsFileByFileIdCompleted(errorCode, "网络请求失败: " + errorString, QVariantMap());
        }
        reply->deleteLater();
        return;
    }
    
    // 读取响应数据
    QByteArray responseData = reply->readAll();
    qDebug() << "GetKmsFileByFileIdCommand: 获取KmsFile响应数据包:" << responseData;
    
    // 解析JSON响应
    QJsonParseError parseError;
    QJsonDocument doc = QJsonDocument::fromJson(responseData, &parseError);
    
    // 再次检查对象是否仍然有效
    if (!isValid()) {
        qDebug() << "GetKmsFileByFileIdCommand: 对象已被销毁，忽略响应解析";
        reply->deleteLater();
        return;
    }
    
    if (parseError.error != QJsonParseError::NoError) {
        qDebug() << "GetKmsFileByFileIdCommand: 获取KmsFile JSON解析错误:" << parseError.errorString();
        if (isValid()) {
            emit getKmsFileByFileIdCompleted(-1, "JSON解析失败: " + parseError.errorString(), QVariantMap());
        }
        reply->deleteLater();
        return;
    }
    
    if (!doc.isObject()) {
        qDebug() << "GetKmsFileByFileIdCommand: 获取KmsFile响应不是有效的JSON对象";
        if (isValid()) {
            emit getKmsFileByFileIdCompleted(-1, "响应格式错误", QVariantMap());
        }
        reply->deleteLater();
        return;
    }
    
    QJsonObject response = doc.object();
    parseGetKmsFileResponse(response);
    
    reply->deleteLater();
}

void GetKmsFileByFileIdCommand::parseGetKmsFileResponse(const QJsonObject &response)
{
    // 检查对象是否仍然有效
    if (!isValid()) {
        qDebug() << "GetKmsFileByFileIdCommand: 对象已被销毁，忽略响应解析";
        return;
    }
    
    qDebug() << "GetKmsFileByFileIdCommand: 解析获取KmsFile响应";
    
    int errcode = response["errcode"].toInt();
    QString errmsg = response["errmsg"].toString();
    
    qDebug() << "GetKmsFileByFileIdCommand: 获取KmsFile结果 - 错误码:" << errcode << "错误消息:" << errmsg;
    
    if (errcode == 0) {
        // 解析文件数据
        if (response.contains("data") && response["data"].isObject()) {
            QJsonObject fileData = response["data"].toObject();
            qDebug() << "GetKmsFileByFileIdCommand: 获取KmsFile - 文件数据:" << fileData;
            
            // 将QJsonObject转换为QVariantMap以便通过信号传递
            QVariantMap fileMap;
            fileMap["id"] = fileData["id"].toString();
            fileMap["name"] = fileData["name"].toString();
            fileMap["creatorId"] = fileData["creatorId"].toString();
            fileMap["creator"] = fileData["creator"].toString();
            fileMap["createDate"] = fileData["createDate"].toString();
            fileMap["lastModifyDate"] = fileData["lastModifyDate"].toString();
            fileMap["diskId"] = fileData["diskId"].toString();
            fileMap["domainId"] = fileData["domainId"].isNull() ? QVariant() : fileData["domainId"].toString();
            fileMap["folderId"] = fileData["folderId"].toString();
            fileMap["folder"] = fileData["folder"].toBool();
            fileMap["size"] = fileData["size"].toVariant();
            fileMap["path"] = fileData["path"].toString();
            fileMap["removeOperator"] = fileData["removeOperator"].isNull() ? QVariant() : fileData["removeOperator"].toString();
            fileMap["version"] = fileData["version"].toInt();
            fileMap["orderNo"] = fileData["orderNo"].toInt();
            fileMap["type"] = fileData["type"].toInt();
            fileMap["maxVersion"] = fileData["maxVersion"].toInt();
            fileMap["head"] = fileData["head"].toBool();
            fileMap["recycleDelete"] = fileData["recycleDelete"].toBool();
            fileMap["delete"] = fileData["delete"].toBool();
            
            // 最后一次检查对象是否仍然有效
            if (!isValid()) {
                qDebug() << "GetKmsFileByFileIdCommand: 对象已被销毁，无法发送完成信号";
                return;
            }
            
            // 发送完成信号
            emit getKmsFileByFileIdCompleted(0, "获取KmsFile成功", fileMap);
        } else {
            qDebug() << "GetKmsFileByFileIdCommand: 获取KmsFile - data字段不是对象或不存在";
            if (isValid()) {
                emit getKmsFileByFileIdCompleted(-4, "响应数据格式错误：data字段不是对象", QVariantMap());
            }
        }
    } else {
        qDebug() << "GetKmsFileByFileIdCommand: 获取KmsFile失败:" << errmsg;
        if (isValid()) {
            emit getKmsFileByFileIdCompleted(errcode, errmsg, QVariantMap());
        }
    }
}

QString GetKmsFileByFileIdCommand::buildRequestUrl(const QString &baseUrl, const QString &fileId)
{
    return baseUrl + QString("/kms/api/kms/sync/files/%1").arg(fileId);
}

